package basis.netease.hard;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 7-17 无重复字符的最长子串
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 * 输入样例1:
 * 在这里给出一组输入。例如：
 * abcabcbb
 * 输出样例1:
 * 在这里给出相应的输出。例如：
 * 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 输入样例2:
 * 在这里给出一组输入。例如：
 * bbbbb
 * 输出样例2:
 * 在这里给出相应的输出。例如：
 * 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 * 输入样例3:
 * 在这里给出一组输入。例如：
 * pwwkew
 * 输出样例3:
 * 在这里给出相应的输出。例如：
 * 3
 * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
 * 请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 * 提示：s 由英文字母、数字、符号和空格组成
 */
public class Main_13 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(cal(sc.nextLine()));
    }

    public static int cal(String s) {
        if (s.length() == 0) {
            return 0;
        }
        // 用于存储字符及其最后一次出现的位置
        Map<Character, Integer> map = new HashMap<>();
        // 记录最长子串的长度
        int max = 0;
        // 滑动窗口的左边界
        int left = 0;
        for (int right = 0; right < s.length(); right++) {
            char currentChar = s.charAt(right);
            // 如果当前字符在滑动窗口内已经存在，则移动左边界
            if (map.containsKey(currentChar)) {
                left = map.get(currentChar) + 1;
            }
            // 更新字符的位置
            map.put(currentChar, right);
            // 更新最长子串的长度
            max = Math.max(max, right - left + 1);
        }
        return max;
    }
}
